﻿package com.h819.core.utils;

import org.apache.commons.lang.text.StrTokenizer;
import org.apache.log4j.Logger;

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class Utils {

	static Logger log = Logger.getLogger(Utils.class);

	//防止被初始化
	private Utils(){
		
	}

	
	/**
	 * 此函数求循环次数。类似“分针开始位于12点的位置，90分钟的时间段，分针经过几次12点的位置？（起始时在12点的位置不计）”
	 * 
	 * @param allCount
	 *            总时间
	 * @param LIMIT_COUNT
	 *            一圈需要的时间
	 */

	public static int getRecurrent(int allCount, int LIMIT_COUNT) {

		int temp1 = allCount / LIMIT_COUNT;
		int temp2 = allCount % LIMIT_COUNT;
		int count = 0;

		// System.out.println(temp1);
		// System.out.println(temp2);

		// 不满 60 分钟，算一圈
		if (temp1 == 0) {
			if (temp2 != 0) {
				count = 1;
			} else {// 此时 总时间数为 0;
				count = 0;
			}
		} else { // 大于等于60 分钟

			if (temp2 != 0) {
				// 非 60 的倍数
				count = temp1 + 1;
			} else {
				// 60 的倍数;
				count = temp1;
			}
		}

		return count;
	}

	/**
	 * 此函数用来按照指定字符来拆分字符串
	 * 
	 * @param element
	 *            想要拆分的字符串
	 * 
	 * @param token
	 *            字符串分割符
	 * 
	 * @return 拆分后的字符串数组
	 * 
	 * 
	 */

	public static String[] getStringbyToken(String element, String token) {
		return new StrTokenizer(element, token).getTokenArray();
	}



	/**
	 * 将旧的15位身份证件号，转成18位， 同时进行身份证信息的简单校验 如果是18位，则只进行校验
	 * 
	 * @param orgIDCardNo
	 * @return
	 * @throws ParseException
	 */
	public static String converse15DigitTo18Digit(String orgIDCardNo)
			throws ParseException {

		if (orgIDCardNo == null) {
			throw new IllegalArgumentException("身份证号为null");
		}
		String buffer = orgIDCardNo.trim();
		int numberLength = buffer.length();

		// 校验身份证位数，如果不是15位或18位，则抛出“IllgalArgumentException非法的证件号码”异常
		if (numberLength != 15 && numberLength != 18) {
			throw new ParseException("不合格的身份证号", 0);
		}

		// 校验身份证的日期参数
		if (numberLength == 15) {
			// 校验15位身份证的日期参数
			String birthDateStr = buffer.substring(6, 12);
			try {
				new SimpleDateFormat("yyMMdd").parse(birthDateStr);
			} catch (ParseException e) {
				e.printStackTrace();
				throw new ParseException("不合格的身份证号", 7);
			}
			// 对15位的证件转换18位的前缀部分
			buffer = buffer.substring(0, 6) + "19" + buffer.substring(6, 15);

		} else {
			// 校验18位身份证的日期参数
			String birthDateStr = buffer.substring(6, 14);
			try {
				new SimpleDateFormat("yyyyMMdd").parse(birthDateStr);
			} catch (ParseException e) {
				e.printStackTrace();
				throw new ParseException("不合格的身份证号", 7);
			}
			// 截取前17位，对18位证件进行尾部编码重计算
			buffer = buffer.substring(0, 17);
		}

		// 计算18位证的校验位
		char[] charArray = buffer.toCharArray();
		int factor = 0;
		for (int i = 18; i >= 2; i--) {
			factor += (((int) Math.pow(2, (i - 1))) % 11)
					* ((charArray[18 - i] & 0xff) - 48);
		}
		factor %= 11;
		switch (factor) {
		case 0:
			buffer += "1";
			break;
		case 1:
			buffer += "0";
			break;
		case 2:
			buffer += "X";
			break;
		case 3:
			buffer += "9";
			break;
		case 4:
			buffer += "8";
			break;
		case 5:
			buffer += "7";
			break;
		case 6:
			buffer += "6";
			break;
		case 7:
			buffer += "5";
			break;
		case 8:
			buffer += "4";
			break;
		case 9:
			buffer += "3";
			break;
		case 10:
			buffer += "2";
			break;
		}

		// 如果是18位的身份证，要同原始的证件代码进行校验
		if (numberLength == 18 && !buffer.equals(orgIDCardNo.trim())) {
			throw new ParseException("不合格的身份证号", 18);
		}

		return buffer;
	}

	
	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		// 身份证验证
		try {
			// 18 位
			System.out.println(Utils
					.converse15DigitTo18Digit("230103197404180351"));
			// 15 位
			System.out.println(Utils
					.converse15DigitTo18Digit("210101830101065"));

		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
